# encoding: utf-8

require 'fileutils'
require 'nokogiri'

require 'open-uri'
require "win32ole"
require "zip"

def download_file(fileName, uri)
	data = open(uri, 'User-Agent' => 'ruby'){|f| f.read} 
	
	file = File.new fileName, 'w+'
	file.binmode 
	file << data 
	file.flush 
	file.close
end

def main
  # 解析XML文件，获得更新地址
  if !File.exist?("UpdateSet.xml")
    puts "本地自动更新配置文件不存在，请检查您的采客程序是否已经损坏？"
    return false
  end

  puts "比较服务器版本……"
  doc = File.open("UpdateSet.xml") { |f| Nokogiri::XML(f) }
  current_version = doc.xpath("//Version").text
  # 获得更新地址
  download_uri = doc.xpath("//UpdateURL").text
  # 获得当前软件在系统中进程名
  proc_name = doc.xpath("//AppName").text
  (proc_name = proc_name + '.exe') if !proc_name.include?('.')
  # 获得更新的文件在本地存放的临时路径
  temp_dir = doc.xpath("//TempFile").text
  (temp_dir = "update_temp") if temp_dir.nil? || temp_dir.strip == ""
  puts "临时文件目录：" + temp_dir
  
  FileUtils.remove_dir(temp_dir, true)
  FileUtils.mkdir_p(temp_dir)
  FileUtils.mkdir_p(File.join(temp_dir, 'to_be_copy'))
  download_file(File.join(temp_dir, "update.xml"), download_uri)
  
  doc2 = File.open(File.join(temp_dir, "update.xml") ) { |f| Nokogiri::XML(f) }
  new_version = doc2.xpath("//Version").text

  if current_version >= new_version
    puts "目前已经是最新版本了！"
    return false
  else
    # 下载文件列表
    puts "正在准备需要下载更新的文件……"
    file_source = doc2.xpath("//filelist")[0]["sourcepath"]
    file_list = doc2.xpath("//file")
    file_list.each do |f|
      puts "正在下载：#{f["name"]}"
      download_file File.join(temp_dir, f["name"]), File.join(file_source, f["name"])
      
      # 如果是普通文件，则COPY到to_be_copy文件夹
      # 如果是需要解压缩的文件，则解压缩到to_be_copy文件夹
      if f["need_express"] && f["need_express"] == "1"
        Zip::File.open(File.join(temp_dir, f["name"])) do |zip_file|
          # Handle entries one by one
          zip_file.each do |entry|
            # Extract to file/directory/symlink
            puts "解压缩：" + entry.name #.encoding
            entry.extract(File.join(temp_dir, "to_be_copy", entry.name))
          end
        end
      else
        FileUtils.cp(File.join(temp_dir, f["name"]), File.join(temp_dir, "to_be_copy", f["name"]) )
      end
    end
    
    # 杀死windows进程
    mgmt = WIN32OLE.connect('winmgmts:\\\\.') 
    mgmt.ExecQuery("SELECT * FROM Win32_Process WHERE Name ='#{proc_name}'").each do |item| 
      item.Terminate() 
    end
    
    # 复制更新下载的文件
    puts "复制更新的文件……"
    # 直接COPY整个to_be_copy文件夹
    FileUtils.cp_r(File.join(temp_dir, "to_be_copy/."), "./")
    
    # 删除需要删除的文件
    filedelete = doc2.xpath("//filedelete")
    filedelete.each do |fd|
      puts "删除文件：" + fd["name"]
      begin
        FileUtils.remove_entry(fd["name"])
      rescue
        puts "警告！删除该文件错误：" + fd["name"]
      end
    end
    
    puts "采客财务数据采集工具已经更新完毕。"
    
    # 显示更新信息
    puts '*'*40
    content = doc2.xpath("//updateContent")
    content.children.each do |c|
      c.children.each{ |cc| (puts cc.text) if !cc.nil? && cc.text.strip != "" }
    end
    puts '*'*40
  end
  # 删除临时文件夹
  FileUtils.remove_dir(temp_dir, true)
  
  return true
end

main
puts "请键入【回车】关闭这个窗口。"
gets
